﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;

namespace SIMCRepositorio
{
    public class RepositorioAtributoPersona : Database, IRepositorioAtributoPersona
    {
        public List<ClasificacionPersonas> Buscar(int p_IdPersona)
        {
            try
            {                
                var query = from persona in Context.per_personas
                            join personaAtributo in Context.per_atributos
                                on persona.per_icodigo equals personaAtributo.cla_ipersona
                            join atributo in Context.cla_atributos
                                on personaAtributo.cla_satributo equals atributo.cat_scodigo
                            join valor in Context.cla_valores
                                on new
                                {
                                    codigoAtributo = personaAtributo.cla_satributo,
                                    codigoValor = personaAtributo.cla_svalor
                                }
                            equals
                                new
                                {
                                    codigoAtributo = valor.cav_satributo,
                                    codigoValor = valor.cav_scodigo
                                }
                            where personaAtributo.cla_ipersona == p_IdPersona
                            && Valores.TiposDeAtributo.Contains(atributo.cat_ctipo)
                            select new ClasificacionPersonas
                            {
                                Atributo = personaAtributo.cla_satributo,
                                ValorDelAtributo = personaAtributo.cla_svalor,
                                DescripcionAtributo = atributo.cat_sdescripcion,
                                DescripcionValor = valor.cav_sdescripcion,
                                IdPersona = personaAtributo.cla_ipersona,
                                Orden = atributo.cat_iorden,
                                NombreClasificado = persona.per_sncorto,
                                //CalificadoresValores = new List<string>
                                //{
                                //    valor.cav_scal1,
                                //    valor.cav_scal2,
                                //    valor.cav_scal3
                                //}
                                cav_scal1 = valor.cav_scal1,
                                cav_scal2 = valor.cav_scal2,
                                cav_scal3 = valor.cav_scal3,
                            };
                List<ClasificacionPersonas> lista = query.ToList();

                foreach (ClasificacionPersonas item in lista)//Esto es debido a que en algunos momentos se pierde el orden eque vienen los cav_scal
                {
                    item.CalificadoresValores = new List<string>();

                    item.CalificadoresValores.Add(item.cav_scal1);
                    item.CalificadoresValores.Add(item.cav_scal2);
                    item.CalificadoresValores.Add(item.cav_scal3);
                }

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ClasificacionPersonas> Buscar(int p_IdPersona, string p_Atributo)
        {
            try
            {
                var query = from persona in Context.per_personas
                            join personaAtributo in Context.per_atributos
                                on persona.per_icodigo equals personaAtributo.cla_ipersona
                            join atributo in Context.cla_atributos
                                on personaAtributo.cla_satributo equals atributo.cat_scodigo
                            join valor in Context.cla_valores
                                on new
                                {
                                    codigoAtributo = personaAtributo.cla_satributo,
                                    codigoValor = personaAtributo.cla_svalor
                                }
                            equals
                                new
                                {
                                    codigoAtributo = valor.cav_satributo,
                                    codigoValor = valor.cav_scodigo
                                }
                            where personaAtributo.cla_ipersona == p_IdPersona
                            & personaAtributo.cla_satributo == p_Atributo
                            && Valores.TiposDeAtributo.Contains(atributo.cat_ctipo)
                            select new ClasificacionPersonas
                            {
                                Atributo = personaAtributo.cla_satributo,
                                ValorDelAtributo = personaAtributo.cla_svalor,
                                DescripcionAtributo = atributo.cat_sdescripcion,
                                DescripcionValor = valor.cav_sdescripcion,
                                IdPersona = personaAtributo.cla_ipersona,
                                Orden = atributo.cat_iorden,
                                NombreClasificado = persona.per_sncorto,
                                //CalificadoresValores = new List<string>
                                //{
                                //    valor.cav_scal1,
                                //    valor.cav_scal2,
                                //    valor.cav_scal3
                                //},
                                cav_scal1 = valor.cav_scal1,
                                cav_scal2 = valor.cav_scal2,
                                cav_scal3 = valor.cav_scal3,
                                _CalificadoresAtributo = personaAtributo.cla_scalif
                            };

                List<ClasificacionPersonas> lista = query.ToList();

                Atributo definiciones = DatabaseAccess.AtributoRepositorio.Buscar(p_Atributo);

                foreach (ClasificacionPersonas item in lista)
                {
                    item.CalificadoresValores = new List<string>();

                    item.CalificadoresValores.Add(item.cav_scal1);//Esto es debido a que en algunos momentos se pierde el orden eque vienen los cav_scal
                    item.CalificadoresValores.Add(item.cav_scal2);
                    item.CalificadoresValores.Add(item.cav_scal3);
                                
                    item.CalificadoresAtributoDef = definiciones.CalificadoresDeAtributos;
                    item.CalificadoresValoresDef = definiciones.CalificadoresDeValores;
                }

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ClasificacionPersonas> Buscar(string p_Atributo)
        {
            try
            {
                var query = from persona in Context.per_personas
                            join personaAtributo in Context.per_atributos
                                on persona.per_icodigo equals personaAtributo.cla_ipersona
                            join atributo in Context.cla_atributos
                                on personaAtributo.cla_satributo equals atributo.cat_scodigo
                            join valor in Context.cla_valores
                                on new
                                {
                                    codigoAtributo = personaAtributo.cla_satributo,
                                    codigoValor = personaAtributo.cla_svalor
                                }
                            equals
                                new
                                {
                                    codigoAtributo = valor.cav_satributo,
                                    codigoValor = valor.cav_scodigo
                                }
                            where personaAtributo.cla_satributo == p_Atributo
                            && Valores.TiposDeAtributo.Contains(atributo.cat_ctipo)
                            select new ClasificacionPersonas
                            {
                                Atributo = personaAtributo.cla_satributo,
                                ValorDelAtributo = personaAtributo.cla_svalor,
                                DescripcionAtributo = atributo.cat_sdescripcion,
                                DescripcionValor = valor.cav_sdescripcion,
                                IdPersona = personaAtributo.cla_ipersona,
                                Orden = atributo.cat_iorden,
                                NombreClasificado = persona.per_sncorto,
                                //CalificadoresValores = new List<string>
                                //{
                                //    valor.cav_scal1,
                                //    valor.cav_scal2,
                                //    valor.cav_scal3
                                //},                                
                                _CalificadoresAtributo = personaAtributo.cla_scalif
                            };

                List<ClasificacionPersonas> lista = query.ToList();

                foreach (ClasificacionPersonas item in lista)//Esto es debido a que en algunos momentos se pierde el orden eque vienen los cav_scal
                {
                    item.CalificadoresValores = new List<string>();

                    item.CalificadoresValores.Add(item.cav_scal1);
                    item.CalificadoresValores.Add(item.cav_scal2);
                    item.CalificadoresValores.Add(item.cav_scal3);
                }

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Guardar(ClasificacionPersonas p_clasificacion)
        {
            try
            {
                per_atributos pA = new per_atributos
                {
                    cla_satributo = p_clasificacion.Atributo,
                    cla_svalor = p_clasificacion.ValorDelAtributo,
                    cla_ipersona = p_clasificacion.IdPersona,
                    cla_scalif = p_clasificacion._CalificadoresAtributo//Solo se actualiza esta propiedad
                };

                if (EsNuevo(pA))
                {
                    base.Insertar(pA);
                }
                else
                {
                    Modificar(pA);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool EsNuevo(per_atributos p_Objeto)
        {
            return BuscarCantidad(p_Objeto.cla_ipersona, p_Objeto.cla_satributo, p_Objeto.cla_svalor) == 0;
        }

        private int BuscarCantidad(int p_IdPersona, string p_Atributo, string p_Valor)
        {
            try
            {
                var query = from peratributo in Context.per_atributos
                            where peratributo.cla_ipersona == p_IdPersona
                            && peratributo.cla_satributo == p_Atributo
                            && peratributo.cla_svalor == p_Valor
                            select peratributo.cla_satributo;

                return query.Count();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

    public interface IRepositorioAtributoPersona
    {
        List<ClasificacionPersonas> Buscar(int p_IdPersona);
        List<ClasificacionPersonas> Buscar(int p_IdPersona, string p_Atributo);
        List<ClasificacionPersonas> Buscar(string p_Atributo);

        void Guardar(ClasificacionPersonas p_clasificacion);
    }
}
